import { _decorator, Node, UITransform } from 'cc'
import { DIRECTION_ENUM, ENTITY_STATE_ENUM, ENTITY_TYPE_ENUM, EVENT_NAME_ENUM } from '../enums'
import { EntityMgr } from '../base/EntityMgr'
import EventMgr from '../runtime/EventMgr'
import { BurstStateMachine } from './BurstStateMachine'
import { TILE_CONFIGS } from '../utils/constants'
import DataMgr from '../runtime/DataMgr'
import { IEntity } from '../levels'
const { ccclass, property } = _decorator
/** 地裂陷阱管理器 实际创建地裂陷阱的逻辑 */
// 紧记 地图是以左上角为原点，向下y轴是负数，往左x轴是正数的坐标图
@ccclass('BurstMgr')
export class BurstMgr extends EntityMgr {
  update() {
    // 重写父类的位置偏移
    this.node.setPosition(this.x * TILE_CONFIGS.TILE_WIDTH, this.y * TILE_CONFIGS.TILE_HEIGHT)
  }
  async init(initData: IEntity) {
    // 添加状态机
    this.fsm = this.addComponent(BurstStateMachine)
    await this.fsm.init() // 初始化状态机参数

    // 使用父类的init方法
    super.init(initData)

    // 重写父类设置的大小
    const transform = this.getComponent(UITransform)
    transform.setContentSize(TILE_CONFIGS.TILE_WIDTH, TILE_CONFIGS.TILE_HEIGHT)

    EventMgr.Instance.on(EVENT_NAME_ENUM.PLAYER_MOVE_END, this.handleEnterBurst, this) // 监听玩家移动结束事件
  }

  // 处理玩家进入陷阱的逻辑
  handleEnterBurst() {
    // 陷阱已经触发或者玩家不存在
    if (this.state === ENTITY_STATE_ENUM.DEATH || !DataMgr.Instance.player) return
    // 取出玩家的坐标
    const { x: playerX, y: playerY } = DataMgr.Instance.player

    if (playerX === this.x && playerY === this.y && this.state === ENTITY_STATE_ENUM.IDLE) {
      this.state = ENTITY_STATE_ENUM.ATTACK // 陷阱触发地裂 但是还没有完全碎裂
    } else if (this.state === ENTITY_STATE_ENUM.ATTACK) {
      this.state = ENTITY_STATE_ENUM.DEATH // 陷阱已经触发地裂
      if (playerX === this.x && playerY === this.y) {
        // 如果在陷阱地裂时，玩家站在陷阱上，触发玩家空中死法
        EventMgr.Instance.emit(EVENT_NAME_ENUM.ATTACK_PLAYER, ENTITY_STATE_ENUM.AIRDEATH)
        // 地裂死亡时触发震动
        EventMgr.Instance.emit(EVENT_NAME_ENUM.SCREEN_SHAKE, DIRECTION_ENUM.BOTTOM)
      }
    }
  }

  onDestroy(): void {
    EventMgr.Instance.off(EVENT_NAME_ENUM.PLAYER_MOVE_END, this.handleEnterBurst)
  }
}
